/**
 * 研发项目分支模型
 * 用于管理项目分支，支持在项目某个状态点创建分支项目
 */
const { BaseModel } = require('../config/models_config');

class ResearchProjectBranchModel extends BaseModel {
	constructor() {
		super();
		this.setCollection('research_project_branch');
	}

	/**
	 * 获取分支类型名称
	 * @param {Number} type 分支类型
	 * @returns {String} 分支类型名称
	 */
	static getBranchTypeName(type) {
		return this.BRANCH_TYPE_NAME[type] || '未知';
	}

	/**
	 * 获取分支状态名称
	 * @param {Number} status 分支状态
	 * @returns {String} 分支状态名称
	 */
	static getBranchStatusName(status) {
		return this.BRANCH_STATUS_NAME[status] || '未知';
	}
	
	/**
	 * 获取冲突类型名称
	 * @param {Number} type 冲突类型
	 * @returns {String} 冲突类型名称
	 */
	static getConflictTypeName(type) {
		return this.CONFLICT_TYPE_NAME[type] || '未知';
	}
	
	/**
	 * 是否可以合并分支
	 * @param {Object} branch 分支对象
	 * @param {Object} targetBranch 目标分支对象
	 * @returns {Object} 检查结果：{ canMerge: boolean, reason: string, conflicts: Array }
	 */
	static canMerge(branch, targetBranch) {
		if (!branch || !targetBranch) {
			return { canMerge: false, reason: '分支数据不完整', conflicts: [] };
		}
		
		// 检查分支状态
		if (branch.BRANCH_STATUS !== this.BRANCH_STATUS.ACTIVE) {
			return { 
				canMerge: false, 
				reason: `当前分支状态为"${this.getBranchStatusName(branch.BRANCH_STATUS)}"，不能合并`,
				conflicts: []
			};
		}
		
		if (targetBranch.BRANCH_STATUS !== this.BRANCH_STATUS.ACTIVE) {
			return { 
				canMerge: false, 
				reason: `目标分支状态为"${this.getBranchStatusName(targetBranch.BRANCH_STATUS)}"，不能合并`,
				conflicts: []
			};
		}
		
		// 检查递归问题
		if (branch.BRANCH_ID === targetBranch.BRANCH_ID) {
			return { canMerge: false, reason: '不能合并到自身', conflicts: [] };
		}
		
		// 检查已有的冲突
		const conflicts = branch.CONFLICTS || [];
		if (conflicts.length > 0) {
			return { 
				canMerge: false, 
				reason: `存在${conflicts.length}个未解决的冲突`, 
				conflicts
			};
		}
		
		// 可以合并
		return { canMerge: true, reason: '可以合并', conflicts: [] };
	}
	
	/**
	 * 获取分支树结构
	 * @param {Array} branches 分支数组
	 * @returns {Object} 树结构
	 */
	static getBranchTree(branches) {
		if (!branches || branches.length === 0) return null;
		
		// 创建分支ID映射
		const branchMap = branches.reduce((acc, branch) => {
			acc[branch.BRANCH_ID] = {
				...branch,
				children: []
			};
			return acc;
		}, {});
		
		// 构建树结构
		const rootBranches = [];
		
		for (const branchId in branchMap) {
			const branch = branchMap[branchId];
			
			if (branch.PARENT_BRANCH_ID && branchMap[branch.PARENT_BRANCH_ID]) {
				// 有父分支，添加为子分支
				branchMap[branch.PARENT_BRANCH_ID].children.push(branch);
			} else {
				// 没有父分支，作为根分支
				rootBranches.push(branch);
			}
		}
		
		return rootBranches;
	}
}

// 分支类型枚举
ResearchProjectBranchModel.BRANCH_TYPE = {
	FEATURE: 1, // 功能分支
	BUGFIX: 2, // 问题修复分支
	ORDER: 3, // 订单分支
	VERSION: 4, // 版本分支
	EXPERIMENT: 5 // 实验分支
};

// 分支类型名称
ResearchProjectBranchModel.BRANCH_TYPE_NAME = {
	[ResearchProjectBranchModel.BRANCH_TYPE.FEATURE]: '功能分支',
	[ResearchProjectBranchModel.BRANCH_TYPE.BUGFIX]: '问题修复分支',
	[ResearchProjectBranchModel.BRANCH_TYPE.ORDER]: '订单分支',
	[ResearchProjectBranchModel.BRANCH_TYPE.VERSION]: '版本分支',
	[ResearchProjectBranchModel.BRANCH_TYPE.EXPERIMENT]: '实验分支'
};

// 分支状态枚举
ResearchProjectBranchModel.BRANCH_STATUS = {
	ACTIVE: 1, // 活动
	MERGED: 2, // 已合并
	CLOSED: 3, // 已关闭
	ABANDONED: 4, // 已废弃
	WAITING_FOR_MERGE: 5 // 等待合并
};

// 分支状态名称
ResearchProjectBranchModel.BRANCH_STATUS_NAME = {
	[ResearchProjectBranchModel.BRANCH_STATUS.ACTIVE]: '活动',
	[ResearchProjectBranchModel.BRANCH_STATUS.MERGED]: '已合并',
	[ResearchProjectBranchModel.BRANCH_STATUS.CLOSED]: '已关闭',
	[ResearchProjectBranchModel.BRANCH_STATUS.ABANDONED]: '已废弃',
	[ResearchProjectBranchModel.BRANCH_STATUS.WAITING_FOR_MERGE]: '等待合并'
};

// 冲突类型枚举
ResearchProjectBranchModel.CONFLICT_TYPE = {
	RESOURCE_VERSION: 1, // 资源版本冲突
	PROJECT_STATUS: 2, // 项目状态冲突
	DOCUMENT: 3, // 文档冲突
	OTHER: 4 // 其他冲突
};

// 冲突类型名称
ResearchProjectBranchModel.CONFLICT_TYPE_NAME = {
	[ResearchProjectBranchModel.CONFLICT_TYPE.RESOURCE_VERSION]: '资源版本冲突',
	[ResearchProjectBranchModel.CONFLICT_TYPE.PROJECT_STATUS]: '项目状态冲突',
	[ResearchProjectBranchModel.CONFLICT_TYPE.DOCUMENT]: '文档冲突',
	[ResearchProjectBranchModel.CONFLICT_TYPE.OTHER]: '其他冲突'
};

// 数据结构定义
ResearchProjectBranchModel.DB_STRUCTURE = {
	_id: 'string|true',
	BRANCH_ID: 'string|true|comment=分支ID',
	BRANCH_NAME: 'string|true|comment=分支名称',
	BRANCH_TYPE: 'int|true|default=1|comment=分支类型：1=功能分支,2=问题修复分支,3=订单分支,4=版本分支,5=实验分支',
	BRANCH_STATUS: 'int|true|default=1|comment=分支状态：1=活动,2=已合并,3=已关闭,4=已废弃,5=等待合并',
	BRANCH_DESC: 'string|false|comment=分支描述',
	
	PARENT_PROJECT_ID: 'string|true|comment=父项目ID',
	PARENT_PROJECT_CODE: 'string|true|comment=父项目编码',
	PARENT_PROJECT_NAME: 'string|true|comment=父项目名称',
	PARENT_BRANCH_ID: 'string|false|comment=父分支ID（如果有）',
	PARENT_BRANCH_NAME: 'string|false|comment=父分支名称',
	
	BRANCH_PATH: 'string|false|comment=分支路径（用于展示分支层次关系）',
	BRANCH_DEPTH: 'int|true|default=0|comment=分支深度（根分支为0）',
	
	BRANCH_POINT_STATE_ID: 'string|true|comment=分支点状态ID（从哪个历史状态点创建分支）',
	BRANCH_POINT_STATUS: 'int|true|comment=分支点状态',
	BRANCH_POINT_SUB_STATUS: 'int|false|comment=分支点子状态',
	BRANCH_POINT_ACTIVE_STATUS: 'int|false|comment=分支点活动状态',
	BRANCH_POINT_TIME: 'int|true|comment=分支点时间',
	
	CURRENT_PROJECT_ID: 'string|true|comment=当前项目ID',
	CURRENT_PROJECT_CODE: 'string|true|comment=当前项目编码',
	CURRENT_PROJECT_NAME: 'string|true|comment=当前项目名称',
	
	CURRENT_STATE_HISTORY_ID: 'string|false|comment=当前状态历史ID',
	CURRENT_STATUS: 'int|false|comment=当前状态',
	CURRENT_SUB_STATUS: 'int|false|comment=当前子状态',
	CURRENT_ACTIVE_STATUS: 'int|false|comment=当前活动状态',
	
	MERGED_TIME: 'int|false|comment=合并时间',
	MERGED_TARGET_BRANCH_ID: 'string|false|comment=合并目标分支ID',
	MERGED_TARGET_BRANCH_NAME: 'string|false|comment=合并目标分支名称',
	MERGED_BY_USER_ID: 'string|false|comment=合并操作人ID',
	MERGED_BY_USER_NAME: 'string|false|comment=合并操作人姓名',
	MERGE_NOTES: 'string|false|comment=合并备注',
	
	MERGE_HISTORY: 'array|true|default=[]|comment=合并历史',
	/*
	[
		{
			MERGE_TIME: 'number', // 合并时间
			MERGE_USER_ID: 'string', // 合并用户ID
			MERGE_USER_NAME: 'string', // 合并用户姓名
			MERGE_NOTES: 'string', // 合并备注
			SOURCE_BRANCH_ID: 'string', // 源分支ID
			SOURCE_BRANCH_NAME: 'string', // 源分支名称
			TARGET_BRANCH_ID: 'string', // 目标分支ID
			TARGET_BRANCH_NAME: 'string', // 目标分支名称
			CONFLICTS: 'array', // 解决的冲突
			STATE_HISTORY_ID: 'string', // 状态历史ID
		}
	]
	*/
	
	CONFLICTS: 'array|true|default=[]|comment=当前冲突',
	/*
	[
		{
			CONFLICT_ID: 'string', // 冲突ID
			CONFLICT_TYPE: 'number', // 冲突类型
			CONFLICT_DESC: 'string', // 冲突描述
			RESOURCE_ID: 'string', // 资源ID（如适用）
			RESOURCE_NAME: 'string', // 资源名称（如适用）
			IS_RESOLVED: 'number', // 是否已解决：0=否,1=是
			RESOLVE_TIME: 'number', // 解决时间
			RESOLVE_USER_ID: 'string', // 解决用户ID
			RESOLVE_USER_NAME: 'string', // 解决用户姓名
			RESOLVE_METHOD: 'string', // 解决方法
		}
	]
	*/
	
	CLOSED_TIME: 'int|false|comment=关闭时间',
	CLOSED_REASON: 'string|false|comment=关闭原因',
	CLOSED_BY_USER_ID: 'string|false|comment=关闭操作人ID',
	CLOSED_BY_USER_NAME: 'string|false|comment=关闭操作人姓名',
	
	RELATED_ISSUES: 'array|true|default=[]|comment=关联的问题',
	/*
	[
		{
			ISSUE_ID: 'string', // 问题ID
			ISSUE_TITLE: 'string', // 问题标题
			ISSUE_STATUS: 'number', // 问题状态
		}
	]
	*/
	
	RELATED_ORDERS: 'array|true|default=[]|comment=关联的订单',
	
	CREATOR_ID: 'string|true|comment=创建人ID',
	CREATOR_NAME: 'string|true|comment=创建人姓名',
	CREATE_TIME: 'int|true|comment=创建时间',
	UPDATE_TIME: 'int|true|comment=更新时间',
	
	GITEA_BRANCH: 'string|false|comment=Gitea分支名称',
	
	CHILD_BRANCHES: 'array|true|default=[]|comment=子分支ID数组',
	
	// 统计信息
	STATE_COUNT: 'int|true|default=0|comment=状态数量',
	RESOURCE_VERSION_COUNT: 'int|true|default=0|comment=资源版本数量',
	SNAPSHOT_COUNT: 'int|true|default=0|comment=快照数量',
	ISSUE_COUNT: 'int|true|default=0|comment=问题数量',
	
	DISPLAY_ORDER: 'int|true|default=0|comment=显示顺序'
};

module.exports = ResearchProjectBranchModel; 